package com.dz.scrm.app.config

import android.content.Context
import com.dz.scrm.mvp.model.entity.CompanyInfoBean
import com.dz.scrm.mvp.model.entity.EventMessage
import com.dz.scrm.utils.*
import com.google.gson.Gson
import me.jessyan.art.http.GlobalHttpHandler
import me.jessyan.art.integration.EventBusManager
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response

/**
 * 作者：fanda
 * 日期：2021/4/21 16:24
 * 描述：一个全局处理 Http 请求和响应结果的处理类, 可以比客户端提前一步拿到服务器返回的结果, 可以做一些操作, 比如 Token 超时后, 重新获取 Token
 */
class GlobalHttpHandlerImpl(val context: Context) : GlobalHttpHandler {

    override fun onHttpRequestBefore(chain: Interceptor.Chain, request: Request): Request {
        /* 如果需要在请求服务器之前做一些操作, 则重新构建一个做过操作的 Request 并 return, 如增加 Header、Params 等请求信息, 不做操作则直接返回参数 request
            return chain.request().newBuilder().header("token", tokenId).build(); */

        //全局添加 token 头
        return request.newBuilder().addHeader("Dz-Auth", "bearer " + getToken()).build()
    }

    override fun onHttpResultResponse(httpResult: String?, chain: Interceptor.Chain, response: Response): Response {

        /* 这里如果发现 token 过期, 可以先请求最新的 token, 然后在拿新的 token 放入 Request 里去重新请求
        注意在这个回调之前已经调用过 proceed(), 所以这里必须自己去建立网络请求, 如使用 Okhttp 使用新的 Request 去请求
        create a new request and modify it accordingly using the new token
        Request newRequest = chain.request().newBuilder().header("token", newToken)
                             .build();

        retry the request

        response.body().close();
        如果使用 Okhttp 将新的请求, 请求成功后, 再将 Okhttp 返回的 Response return 出去即可
        如果不需要返回新的结果, 则直接把参数 response 返回出去即可 */
//        LoggerUtils.json(httpResult!!)

        if (response.code() == CODE_LOGIN_TOKEN_ERR) {
            EventBusManager.getInstance().post(EventMessage(EVENT_TOKEN_EXPIRED, ""))
        }

        return response

    }
}